/**
 * 
 */
package appStarshipPushups.common;

import java.awt.Point;

/**
 * Cette classe représente le vaisseau du joueur.
 * @author Adam Labranche & Kevin Arsenault
 */
public class Starship
{
	// Constantes de direction du vaisseau.
	public static final int DIRECTION_UP = 0;
	public static final int DIRECTION_DOWN = 1;
	public static final int DIRECTION_LEFT = 2;
	public static final int DIRECTION_RIGHT = 3;
	public static final int DIRECTION_POSSIBILITY = 4;
	
	// Positions par défaut.
	public static final int DEFAULT_X = 0;
	public static final int DEFAULT_Y = 0;
	
	// Points de vie de départ par défaut.
	public static final int START_HP = 100;
	
	// Dimensions du vaisseau.
	public static final int SHIP_HEIGHT = 30;
	public static final int SHIP_WIDTH = 30;
	
	/**
	 * Le nombre de points de vie restant du vaisseau.
	 */
	private int hp = Starship.START_HP;
	/**
	 * L'orientation du vaisseau.
	 */
	private int direction = Starship.DIRECTION_UP;
	/**
	 * La position du vaisseau.
	 */
	private Point position = new Point();
	/**
	 * La position du coin bas à droite du vaisseau.
	 */
	private Point positionSize = new Point();
	/**
	 * L'emplacement du vaisseau.
	 */
	private Emplacement shipPlace = null;
	
	/**
	 * Le numéro d'identification du vaisseau.
	 */
	private int id = 0;
	
	/**
	 * C'est le constructeur par défaut.
	 */
	public Starship()
	{
		this.init(Starship.DEFAULT_X, Starship.DEFAULT_Y, Starship.DIRECTION_UP,
				this.id, this.hp);
	}
	
	/**
	 * Constructeur à paramètres.
	 * @param aXPos La positino x du vaisseau.
	 * @param aYPos La position y du vaisseau.
	 * @param aDirection La direction du vaisseau.
	 * @param aID Le numéro d'identification du vaisseau.
	 */
	public Starship(int aXPos, int aYPos, int aDirection, int aID)
	{
		this.init(aXPos, aYPos, aDirection, aID, this.hp);
	}
	
	/**
	 * Constructeur à paramètres
	 * @param aXPos La position x du vaisseau.
	 * @param aYPos La position y du vaisseau.
	 * @param aDirection La direction du vaisseau.
	 * @param aID Le numéro d'identification du vaisseau.
	 * @param aHP Les points de vie du vaisseau.
	 */
	public Starship(int aXPos, int aYPos, int aDirection, int aID, int aHP)
	{
		this.init(aXPos, aYPos, aDirection, aID, aHP);
	}
	
	/**
	 * Initialise les données du vaisseau.
	 * @param aXPos La position x du vaisseau.
	 * @param aYPos La position y du vaisseau.
	 * @param aDirection La direction du vaisseau.
	 * @param aID Le numéro d'identification du vaisseau.
	 * @param aHP Les points de vie du vaisseau.
	 */
	private void init(int aXPos, int aYPos, int aDirection, int aID, int aHP)
	{
		// Inscrire les attributs du vaisseau.
		this.position.x = aXPos;
		this.position.y = aYPos;
		this.direction = aDirection;	
		this.positionSize.x = Starship.SHIP_WIDTH + aXPos;
		this.positionSize.y = Starship.SHIP_HEIGHT + aYPos;
		this.hp = aHP;
		
		this.id = aID;
		
		this.shipPlace = new Emplacement(this.position, this.positionSize);		
	}
	
	/**
	 * Cette fonction permet d'obtenir le nombre de points de vie restant.
	 * @return Le nombre de points de vie.
	 */
	public int getHP()
	{
		return this.hp;
	}
	
	/**
	 * Cette fonction permet de soustraire ou d'ajouter une certaine quantité
	 * de points de vie.
	 * @param deltaHP Les points de vies ajoutés.
	 */
	public void modHP(int deltaHP)
	{
		this.hp += deltaHP;
	}
	
	/**
	 * Cette fonction permet de modifier la quantité de points de vie.
	 * @param newHP Le nouveau nombre de points de vie.
	 */
	public void setHP(int newHP)
	{
		this.hp = newHP;
	}
	
	/**
	 * Cette fonction permet d'obtenir l'orientation du vaisseau.
	 * @return La direction du devant du vaisseau.
	 */
	public int getDirection()
	{
		return this.direction;
	}
	
	/**
	 * Cette fonction permet d'obtenir l'orientation du vaisseau sous
	 * forme de chaîne de caractères pour le protocole.
	 * @return La direction du vaisseau en chaîne de caractères.
	 */
	public String getStrDirection()
	{
		String result = new String();
		switch(this.direction)
		{
		case Starship.DIRECTION_UP:
			result = Protocole.UP;
			break;
		case Starship.DIRECTION_DOWN:
			result = Protocole.DOWN;
			break;
		case Starship.DIRECTION_LEFT:
			result = Protocole.LEFT;
			break;
		case Starship.DIRECTION_RIGHT:
			result = Protocole.RIGHT;
			break;
		}
		return result;
	}
	
	/**
	 * Cette fonction permet de changer l'orientation du vaisseau.
	 * @param newDirection La nouvelle orientation du vaisseau.
	 */
	public void setDirection(int newDirection)
	{
		// On vérifie que c'est une direction valide.
		if(newDirection >= Starship.DIRECTION_UP && newDirection <= Starship.DIRECTION_RIGHT)
		{
			this.direction = newDirection;
		}
	}
	
	/**
	 * Cette fonction permet d'obtenir la position actuelle du vaisseau.
	 * @return La position actuelle du vaisseau.
	 */
	public Point getPosition()
	{
		return this.position;
	}
	
	/**
	 * Cette fonction permet d'obtenir la position de la taille du vaisseau sur le jeu.
	 * @return La position de la taille du vaisseau.
	 */
	public Point getPositionSize()
	{
		return this.positionSize;
	}
	
	/**
	 * Retourne l'emplacement du vaisseau.
	 * @return L'emplacement du vaisseau.
	 */
	public Emplacement getShipPlace()
	{
		return this.shipPlace;
	}
	
	/**
	 * Cette fonction permet de modifier la position actuelle du vaisseau.
	 * @param newPosition La nouvelle position du vaisseau.s
	 */
	public void setPosition(Point newPosition)
	{
		this.position = newPosition;
		
		this.positionSize.x = this.position.x +  Starship.SHIP_WIDTH;
		this.positionSize.y = this.position.y + Starship.SHIP_HEIGHT;
		
		// Indiquer ce changement à l'emplacement.
		this.shipPlace.setEmplacement(this.position, this.positionSize);
	}
	
	/**
	 * Change la position du vaisseau selon les coordonnées désiérées.
	 * @param aX La position x désirée.
	 * @param aY La position y désirée.
	 */
	public void setPosition(int aX, int aY)
	{
		// Changés les coordonnées.
		this.position.x = aX;
		this.position.y = aY;
		this.positionSize.x = aX +  Starship.SHIP_WIDTH;
		this.positionSize.y = aY + Starship.SHIP_HEIGHT;
		
		// Indiquer ce changement à l'emplacement.
		this.shipPlace.setEmplacement(this.position, this.positionSize);
	}
	
	/**
	 * Bouge le vaisseau selon la distance désirée.
	 * @param aX La distance en x désirée.
	 * @param aY La distance en y désirée.
	 */
	public void move(int aDeltaX, int aDeltaY)
	{
		// Changés les coordonnées.
		this.position.x += aDeltaX;
		this.position.y += aDeltaY;
		this.positionSize.x = this.position.x +  Starship.SHIP_WIDTH;
		this.positionSize.y = this.position.y + Starship.SHIP_HEIGHT;
		
		// Indiquer ce changement à l'emplacement.
		this.shipPlace.setEmplacement(this.position, this.positionSize);
	}
	
	/**
	 * Cette fonction permet d'obtenir le numéro d'identification du vaisseau.
	 * @return Le numéro d'identification du vaisseau.
	 */
	public int getID()
	{
		return this.id;
	}
}
